package rack.lite.model

import rack.lite.utils.DbManager as db
import rack.lite.view.Console as con
/**
 *
 * @author atila
 */
@Singleton class AlunoDao {

   private static String table = "aluno.table"
   private static String tmpTable = "aluno.table.tmp"

   def create(Aluno aluno) {
      def f = db.getTable(table)
      f.append(aluno.toLine())
      println "${con.info} Aluno criado com sucesso.\n"
   }

   def read(long matricula) {

   }

   def read(String login) {
      Aluno aluno = null
      def f = db.getTable(table)
      def list = f.readLines()
      list.each {
         def a = it.split(":")
         def s = a.first()
         if (s.equals(login)) {
            aluno = new Aluno(login:a.first(), nome:a.getAt(1), matricula:a.getAt(2))
            return aluno
         }
      }
   }

   def update(Aluno aluno) {

   }

   def delete(String login) {
      // copia linhas para arquivo tmp, remove aquivo principal e renomeia o tmp para principal.
      if (exists(login)) {
         def list = findAll()
         def tmp = db.getTable(tmpTable)
         list.each { aluno ->
            if (aluno?.login != login) {
               tmp.append(aluno.toLine())
            }
         }
         def f = db.getTable(table)
         f.delete()
         tmp.renameTo(new File(table))
         println "${con.info} Aluno ${login} deletado com sucesso.\n"
      } else {
         println "${con.warning} Erro: Aluno ${login} não existe na base de dados.\n"
      }
   }

   def list() {
      def list = findAll()
      list.each { aluno ->
         println aluno
      }
   }

   def exists(String login) {
      Aluno aluno = new Aluno(login:login)
      def list = findAll()
      if (list.lastIndexOf(aluno) == -1) {
         return false
      }
      return true
   }

   def findAll() {
      def list = []
      def f = db.getTable(table)
      def lines = f.readLines()
      lines.each {
         def a = it.split(":")
         def nome = a.getAt(1)
         if (nome == "null") { nome = null }
         Aluno aluno = new Aluno(login:a.getAt(0), nome:nome, matricula:a.getAt(2).toInteger())
         list.push(aluno)
      }
      return list
   }
}

